/*
 * SignUtils.java 作者：雷清英 2016年6月2日 创建文件
 */
package com.xiaoma.aes.util;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Properties;
import java.util.Set;

/**
 **************************************************
 * 签名工具类
 * @version 0.0.1
 * @author qylei
 * @date 2016年6月2日
 *************************************************
 */
public final class SignUtils{
    
    
    /**
     * 成功
     */
    private static final String IS_SUCCESS = "isSuccess";
    
    /**
     * 错误码
     */
    private static final String ERROR_CODE = "errorCode";
    
    /**
     * 错误信息
     */
    private static final String ERROR_MESSAGE = "errorMessage";
    
    /**
     * 签名
     */
    private static final String SIGN = "sign";
    
    /**
     * 构造方法
     */
    private SignUtils(){}
    
    /**
     * 将参数进行MD5签名
     * 
     * @param params 签名Map集合
     * @param privateKey 签名Key
     * @author qylei
     * @since 0.0.1
     * @return String
     */
    public static String MD5Sign(Map<Object, Object> params, String key){
        if(!BaseUtil.mapNotNull(params) || !BaseUtil.stringNotNull(key)){
            return null;
        }
        
        params = processMap(params);
        
        Properties properties = new Properties();
        
        Set<Entry<Object, Object>> entrySet = params.entrySet();
        
        if(BaseUtil.setNotNull(entrySet)){
            for(Entry<Object, Object> entry : entrySet){
                if(entry != null){
                    String name = (String) entry.getKey();
                    Object value = entry.getValue();
                    
                    if(name == null || name.equalsIgnoreCase(IS_SUCCESS) || name.equalsIgnoreCase(ERROR_CODE) || name.equalsIgnoreCase(ERROR_MESSAGE) || name.equalsIgnoreCase(SIGN)){
                        continue;
                    }
                    
                    properties.setProperty(name, value.toString());
                }
            }
        }
        
        String content = getSignatureContent(properties) + key;
        
        return DigestUtils.md5Message(content);
    }
    
    /**
     * 移除map中空值
     * @param map
     * @return
     * @since 0.0.1
     * @author qylei
     * @since 0.0.1
     * @date 2016年6月2日 创建方法
     */
    private static Map<Object, Object> processMap(Map<Object, Object> map){
        Map<Object, Object> returnMap = null;
        if(BaseUtil.mapNotNull(map)){
            returnMap = new HashMap<Object, Object>();
            
            Set<Entry<Object, Object>> entrySet = map.entrySet();
            if(BaseUtil.setNotNull(entrySet)){
                for(Entry<Object, Object> entry : entrySet){
                    if(entry != null && entry.getValue() != null){
                        if(entry.getValue() instanceof String){
                            String str = (String) entry.getValue();
                            if(str != null && !str.equals("") && !str.equals("null")){
                                returnMap.put(entry.getKey(), entry.getValue());
                            }
                        }else{
                            returnMap.put(entry.getKey(), entry.getValue());
                        }
                    }
                }
            }
        }
        return returnMap;
    }
    
    /**
     * 参数排序
     * @param properties
     * @return string
     * @author qylei
     * @since 0.0.1
     * @date 2016年6月2日 创建方法
     */
    @SuppressWarnings({"rawtypes", "unchecked"})
    private static String getSignatureContent(Properties properties){
        StringBuffer content = new StringBuffer();
        List keys = new ArrayList(properties.keySet());
        Collections.sort(keys);
        
        for(int i = 0; i < keys.size(); i++){
            String key = (String) keys.get(i);
            String value = properties.getProperty(key);
            
            content.append((i == 0 ? "" : "&") + key + "=" + value);
        }
        
        return content.toString();
    }
    
}
